﻿Namespace Seguranca.Dominio

    ''' <summary>
    ''' Classe PapelBase
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> _
    Public MustInherit Class PapelBase

        Private _id As Long
        ''' <summary>
        ''' Identificador do Papel
        ''' </summary>
        ''' <value>Long</value>
        ''' <returns>Long</returns>
        ''' <remarks></remarks>
        Public Overridable Property Id() As Long
            Get
                Return _id
            End Get
            Set(ByVal value As Long)
                _id = value
            End Set
        End Property

        Private _nome As String
        ''' <summary>
        ''' Nome do Papel
        ''' </summary>
        ''' <value>String</value>
        ''' <returns>String</returns>
        ''' <remarks></remarks>
        Public Overridable Property Nome() As String
            Get
                Return _nome
            End Get
            Set(ByVal value As String)
                _nome = value
            End Set
        End Property

        Private _mnemonico As String
        ''' <summary>
        ''' Mnemônico do Papel
        ''' </summary>
        ''' <value>String</value>
        ''' <returns>String</returns>
        ''' <remarks></remarks>
        Public Overridable Property Mnemonico() As String
            Get
                Return _mnemonico
            End Get
            Set(ByVal value As String)
                _mnemonico = value
            End Set
        End Property

        Private _CodigoExterno As String
        ''' <summary>
        ''' Código externo
        ''' </summary>
        ''' <value>String</value>
        ''' <returns>String</returns>
        ''' <remarks></remarks>
        Public Overridable Property CodigoExterno() As String
            Get
                Return _CodigoExterno
            End Get
            Set(ByVal value As String)
                _CodigoExterno = value
            End Set
        End Property

        Private _Tipo As Nullable(Of Integer)
        ''' <summary>
        ''' Tipo
        ''' </summary>
        ''' <value>String</value>
        ''' <returns>String</returns>
        ''' <remarks></remarks>
        Public Overridable Property Tipo() As Nullable(Of Integer)
            Get
                Return _Tipo
            End Get
            Set(ByVal value As Nullable(Of Integer))
                _Tipo = value
            End Set
        End Property

        Private _recursos As IList(Of Recurso)
        ''' <summary>
        ''' Recursos de Segurança
        ''' </summary>
        ''' <value>Lista</value>
        ''' <returns>Lista</returns>
        ''' <remarks></remarks>
        Public Overridable Property Recursos() As IList(Of Recurso)
            Get
                If _recursos Is Nothing Then
                    _recursos = New List(Of Recurso)
                End If
                Return _recursos
            End Get
            Set(ByVal value As IList(Of Recurso))
                _recursos = value
            End Set
        End Property

        Private _restricoes As IList(Of Recurso)
        ''' <summary>
        ''' Restrições de Segurança
        ''' </summary>
        ''' <value>Lista</value>
        ''' <returns>Lista</returns>
        ''' <remarks></remarks>
        Public Overridable Property Restricoes() As IList(Of Recurso)
            Get
                Return _restricoes
            End Get
            Set(ByVal value As IList(Of Recurso))
                _restricoes = value
            End Set
        End Property

        Private _impersonate As Usuario
        ''' <summary>
        ''' Alguns papéis podem representar impersonates de outros usuários, os coordenadores operacionais por exemplo. Nesses casos a propriedade Impersonate vem preenchida com o usuário que o papel representa.
        ''' Por exemplo: O papel 'COL-ACAD-ACIERCO' tem como pai o papel 'ACAD' e é impersonate do usuário 'ACIERCO', portanto, operar com o Papel 'COL-ACAD-ACIERCO' equivale operar com o ACIERCO/ACAD
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overridable Property Impersonate() As Usuario
            Get
                Return _impersonate
            End Get
            Set(ByVal value As Usuario)
                _impersonate = value
            End Set
        End Property

        ''' <summary>
        ''' Sub que adiciona recurso ao Papel
        ''' </summary>
        ''' <param name="_recurso">classe Recurso</param>
        ''' <remarks></remarks>
        Public Overridable Sub AdicionaRecurso(ByRef _recurso As Recurso)
            _recurso.Papeis.Add(Me)
            Recursos.Add(_recurso)
        End Sub

        ''' <summary>
        ''' Sub que adiciona restrição ao Papel.
        ''' </summary>
        ''' <param name="_recurso">classe Recurso</param>
        ''' <remarks></remarks>
        Public Overridable Sub AdicionaRestricao(ByRef _recurso As Recurso)
            _recurso.PapeisComRestricao.Add(Me)
            Restricoes.Add(_recurso)
        End Sub

        ''' <summary>
        ''' Sub que adiciona os recursos.
        ''' </summary>
        ''' <param name="_recursos">Lista(classe Recurso)</param>
        ''' <remarks></remarks>
        Public Overridable Sub AdicionaRecursos(ByRef _recursos As IList(Of Recurso))
            For Each _recurso As Recurso In _recursos
                Me.AdicionaRecurso(_recurso)
            Next
        End Sub

        Public Enum Tipos
            Normal = 0
            Extensao = 1
            Composto = 2
        End Enum

    End Class

End Namespace
